#ifndef SESSIONFRIENDAREA_H
#define SESSIONFRIENDAREA_H
#include "model/data.h"
#include <QGridLayout>
#include <QLabel>
#include <QPainter>
#include <QPushButton>
#include <QScrollArea>
#include <QScrollBar>
#include <QStyleOption>
#include <QWidget>

//////////////////////////////////////////////////////////
/// 滚动区域中的 Item 的类型
//////////////////////////////////////////////////////////
enum ItemType
{
    SessionItemType,
    FriendItemType,
    ApplyItemType
};

//////////////////////////////////////////////////////////
/// 整个滚动区域的实现
//////////////////////////////////////////////////////////
class SessionFriendArea : public QScrollArea
{
    Q_OBJECT
  public:
    explicit SessionFriendArea(QWidget *parent = nullptr);

    // 清空该区域中所有的 item
    void clear();

    // 添加一个 item 到该区域中，itemType 表示添加哪种 item，id 跟着不同的 itemType 有不同的含义
    // 如果是 SessionItem，id 就是 chatSessionId
    // 如果是 FriendItem / ApplyItem，id 就是 userId
    void addItem(ItemType itemType, const QString &id, const QIcon &avatar, const QString &name, const QString &text);

    // 选中某个 item，通过 index 下标选中
    void clickItem(int index);

  private:
    // 往 container 内部的 layout 中添加元素，就能触发 QScrollArea 滚动效果
    QWidget *_container;
  signals:
};

class SessionFriendItem : public QWidget
{
    Q_OBJECT
  public:
    SessionFriendItem(QWidget *owner, const QIcon &avatar, const QString &name, const QString &text);

    void paintEvent(QPaintEvent *event) override; // 重写该函数可以填充 QWidget 中子类的颜色
    void mousePressEvent(QMouseEvent *event) override;
    void enterEvent(QEnterEvent *event) override;
    void leaveEvent(QEvent *event) override;

    void select();

    // 实现 Item 被点击之后的业务逻辑.
    virtual void active();

  private:
    QWidget *owner;
    bool selected = false; // 用于判断当前 item 是否被选中

  protected:
    QLabel *messageLabel;
};

//////////////////////////////////////////////////////////
/// 会话 Item 的实现
//////////////////////////////////////////////////////////
class SessionItem : public SessionFriendItem
{
    Q_OBJECT
  public:
    SessionItem(QWidget *owner, const QString &chatSessionId, const QIcon &avatar, const QString &name,
                const QString &lastMessage);

    void active() override;

    void updateLastMessage(const QString &chatSessionId);

  private:
    // 当前会话Id
    QString _chatSessionId;

    // 最后一条消息的文本预览
    QString _text;
};

//////////////////////////////////////////////////////////
/// 好友 Item 的实现
//////////////////////////////////////////////////////////
class FriendItem : public SessionFriendItem
{
    Q_OBJECT
  public:
    FriendItem(QWidget *owner, const QString &userId, const QIcon &avatar, const QString &name,
               const QString &description);
    void active() override;

  private:
    QString userId;
};

//////////////////////////////////////////////////////////
/// 好友申请 Item 的实现
//////////////////////////////////////////////////////////
class ApplyItem : public SessionFriendItem
{
    Q_OBJECT
  public:
    ApplyItem(QWidget *owner, const QString &userId, const QIcon &avatar, const QString &name);
    void active() override;

  private:
    QString userId;
};

#endif // SESSIONFRIENDAREA_H
